package service;

import entity.User;

import java.util.List;
import java.util.TreeSet;

public interface RankingService {

    public class UserRankPair {
        private User user;
        private long rank;
        public UserRankPair(User user, long rank) {
            this.user = user;
            this.rank = rank;
        }

        public final User getUser() {
            return user;
        }

        public final void setUser(User user) {
            this.user = user;
        }

        public final long getRank() {
            return rank;
        }

        public final void setRank(long rank) {
            this.rank = rank;
        }
    }

    /**
     * 在网站服务器停止运行前将排行信息存入文件中保存
     */
    void dump();

    /**
     * 在网站服务器启动后从文件载入保存的排行榜信息
     */
    void load();

    /**
     * 重新计算排行榜
     * @param users 参与排名的用户列表
     */
    void reset(List<User> users);

    boolean put(User user);
    boolean remove(User user);
    void update(User user);

    /**
     * 返回参与排名的用户数量
     * @return 用户的数量
     */
    int size();

    /**
     * @return 如果该用户存在，返回排名，否则返回-1
     */
    long getRank(User user);

    /**
     * 获取最大排名
     * @return
     */
    long getMaxRank();

    /**
     * @return 如果该用户存在，返回分数，否则返回null
     */
    Long getPoint(User user);

    /**
     * 根据分数查找用户
     * @param point 分数
     * @return 用户的树集
     */
    TreeSet<User> getUsersByPoint(long point);

    /**
     * 根据精确排名查找用户
     * @param rank 排名
     * @return 用户的树集
     */
    TreeSet<User> getUsersByRank(long rank);

    /**
     * 根据排名的范围查找用户
     * @param low  起始排名
     * @param high 终止排名
     * @return 用户的链表
     */
    List<User> getUsersByRank(long low, long high);
}
